<?php
#!/bin/bash

/**
 * User: hzbskak
 * Date: 2020/1/8 - 14:10
 */

namespace app\admin\model;


use app\lib\enum\AuthEnum;
use model\wayModel\cache\WProductCache;
use other\FanJianCovert;
use think\Db;
use think\Model;

/**
 * 公共模型
 * Class CommonModel
 * @package app\admin\model
 */
class CommonModel extends Model
{

    /**
     * 鉴权的主方法
     * @date 2020年1月17日16:35:06
     * ------------------------------
     * 等级为1则不鉴权
     * 找到该访问方法所在方法表中所对应的主键ID
     * 再拿该ID到角色和方法的中间表中比对
     * 判断该方法所对应的角色是否与该用户的角色相同
     * ------------------------------
     * @return bool
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public static function goAuth()
    {
        //    grade=1跳出
        //   -> 通过该方法找到被function表里func_code字段所包含的id
        //   -> 在power表中通过in function_id and = roleid_id 判断是否存在
        $role_id = BsAdminModel::get( session( 'id'))->roleid; // 角色ID
        $grade = BsRoleidModel::get( $role_id)->grade; // 等级
        if( $grade == 1) // 是否是最高级
        {
            return true;
        }

        $url = self::getUrl();

        // 获取功能表中包含当前路径的所有数据集
        $functions = BsFunctionModel::all( function ( $query) use ($url){
            $query->field('id')
                ->where( 'is_delete', 'eq', 1)
                ->where( 'find_in_set( :url, func_code)', [ 'url' => $url]);
        });

        $ids = array_column( $functions, 'id'); // 所有id集

        // 最终鉴权
        $bs_admin_power = BsAdminPowerModel::where( 'roleid_id', 'eq', $role_id)
            ->where( 'function_id', 'in', $ids)
            ->find();
        if( !$bs_admin_power)
        {
            return false;
        }
        return true;
    }

    /**
     * 不需要验证权限的方法
     * @date 2020年1月17日16:34:31
     * @return array
     */
    public static function unAuthPermission()
    {
        return [
            '/admin/User/changepassword'
        ];
    }

    /**
     * 访问的方法是否需要鉴权
     * @date 2020年1月17日16:34:24
     * @return bool
     */
    public static function isNeedAuthPermission()
    {
        $un_auth_permission = self::unAuthPermission(); // 不需要验证权限的方法

        $url = self::getUrl();

        if( in_array( $url, $un_auth_permission)) // 是否需要鉴权
        {
            return false;
        }
        {
            return true;
        }
    }

    /**
     * 访问的方法是否需要登录
     * @date 2020年1月17日16:32:32
     * 需要登录继续 true  不需要的登录 false
     * @return bool
     */
    public static function isNeedLogin()
    {
        $no_login_fun = self::noLoginFun(); // 不需要登录就可以访问的方法

        $url = self::getUrl();  //  当然访问的绝对路径

        if( in_array( $url, $no_login_fun)) // 当前方法是否需要登录
        {
            return false;
        }
        {
            return true;
        }
    }

    /**
     * 当前访问的绝对路径
     * @return string
     */
    public static function getUrl()
    {
        return '/' . self::getType();
    }

    /**
     * 获取当前操作的模块控制器方法
     * @return string
     */
    public static function getType()
    {
        return  request()->module() . '/' . request()->controller() . '/' . request()->action();
    }

    /**
     * 不需要登录就可以访问的方法
     * @date 2020年1月17日16:32:41
     * @return array 绝对路径
     */
    public static function noLoginFun()
    {
        return [
            '/admin/login/login'    // 后台登录
        ];
    }

    /**
     * 获取右侧边栏tabBar
     * @date 2020年1月17日17:35:01
     * 获取用户默认首页，根据url值到菜单栏中获取对应的menu_id、在公共语言表中查询指定语言
     * @return array
     * @throws \think\exception\DbException
     */
    public static function getTabBar()
    {
        $home = BsRoleidModel::where( 'id', 'eq', session( 'user.roleid'))
            ->value('home'); // 获取默认首页

        $name = BsMenuModel::get( function ( $query) use ( $home) {
            $query->alias('b')
                ->field('b.*,l.hk_name')
                ->join('la_public_lang l',
                    '( b.menu_id = l.data_id and l.lang_type = "bs_menu/menu_name")')
                ->where('b.menu_url', 'eq', $home);
        }); // 根据默认首页url查询出对应名称

        return [ 'url' => $home, 'menu' => $name['hk_name']];
    }

    /**
     * 左侧导航栏
     * @date 2020年1月17日16:42:17
     * ------------------------
     * 等级是 1 直接搜索菜单表数据
     *
     * 等级非 1 则根据用户角色ID到role_id与function_id的中间表中获取function ID集，
     * @f1 再获取function表中ID对应的func_menuid 集，
     * @f2 通过f1 获取的值在菜单表中获取数据
     * @f3 查询 f2 中所有的子类，所有父类
     * @f4合并f3并去重
     * @f5 根据f4的结果去菜单中获取对应数据集
     *
     * 调用tree组装树并返回 @see BsMenuModel::getTree
     * ------------------------
     * @return BsMenuModel[]|array|false
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public static function menuList()
    {
        /*// 注意：不要忘记加限制条件（is_delete 等等）
        // 1 等级为1，超级管理员，去menu表中查所有。 直接跳到第4步
        //     反之根据角色ID 关联bs_funciton表（中间表bs_admin_power） 查到function表中func_menuid字段
        // 2 根据func_menuid在menu表中查出对应数据，
        // 3 递归查询该数据的所有子级和所有父级
        // 4 把所有递归查到的数据再递归成tree型数据*/
        $grade = BsRoleidModel::get( session( 'user.roleid'))['grade']; // 等级
        if( $grade == AuthEnum::SUPER) // 是否是超级管理员
        {
            $menu_list = BsMenuModel::all( function ( $query){
                $query->alias( 'b')
                    ->join( 'la_public_lang l',
                        "( b.menu_id = l.data_id and l.lang_type = 'bs_menu/menu_name')")
                    ->field( 'b.*,l.hk_name')
                    ->where( 'b.is_delete', 'eq', 1)
                    ->where( 'b.menu_hidden', 'eq', 1);
            }); // SUPER权限，直接查询菜单表中的所有数据
        }
        else
        {
            $bs_roleid=  BsRoleidModel::get( session( 'user.roleid')); // 获取角色ID
            $bs_admin_power = $bs_roleid->bsAdminPower();  // 关联中间表
            $func_menuids = array_column( $bs_admin_power, 'func_menuid'); // 查出在menu表中对应的主键IDs

            $menu_list = BsMenuModel::all( function ( $query) use ( $func_menuids){
                $query->alias( 'b')
                    ->join( 'la_public_lang l',
                        "( b.menu_id = l.data_id and l.lang_type = 'bs_menu/menu_name')")
                    ->field( 'b.*,l.hk_name')
                    ->where( 'b.menu_id', 'in', $func_menuids)
                    ->where( 'b.is_delete', 'eq', 1)
                    ->where( 'b.menu_hidden', 'eq', 1);
            }); // 普通权限，根据$func_menuids查询菜单表中的数据

            // 查询所有子类
            $menu_children = [];
            foreach ( $menu_list as $k => $v)
            {
                array_push( $menu_children, BsMenuModel::getChildren( $v['menu_id'])); // 调用递归
            }
            $menu_children = end( $menu_children); // 所有子类

            // 查询所有父类
            $menu_parent = [];
            foreach ( $menu_list as $k => $v)
            {
                if( $v['parentid'] != 0) // 父ID不为0，递归调用
                {
                    array_push( $menu_parent, BsMenuModel::getParents( $v['parentid']));
                }
                array_push( $menu_parent, $v);
            }

            $menu = array_merge( $menu_parent, $menu_children); // 合并子类和父类
            $menu_ids = array_unique( array_column( $menu, 'menu_id')); // 去重

            $menu_list = BsMenuModel::all( function ( $query) use ( $menu_ids){
                $query->alias( 'b')
                    ->join( 'la_public_lang l',
                        "( b.menu_id = l.data_id and l.lang_type = 'bs_menu/menu_name')")
                    ->field( 'b.*,l.hk_name')
                    ->where( 'menu_id', 'in', $menu_ids)
                    ->where( 'b.is_delete', 'eq', 1)
                    ->where( 'b.menu_hidden', 'eq', 1);
            }); // 所有可访问的菜单 二维数组

        }

        return BsMenuModel::getTree( $menu_list); // 调用组装树
    }

    /**
     * 获取用户列排序配置
     * @date 2020年1月19日09:50:09
     * -----------------------
     * 获取排序表中需要的字段，组装数据。有则更新，无则添加
     * -----------------------
     * @param $data array 用户所保存的配置
     * @return bool
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public static function addOrderChange( $data)
    {
        $user_id = session( 'id');  // 用户ID
        $menu_id = BsMenuModel::field( 'menu_id')
            ->where( 'menu_url', $data['menu'])
            ->find()['menu_id']; // 操作的菜单表ID
        $list = [];
        $data['list'] = explode( ',', $data['list']);
        foreach ( $data['list'] as $k => $v) // 组装数据
        {
            $list[$v] = $data['widgets'][$k];
        }

        $old_data = BsAdminSettingModel::getByUserIDMenuID( $user_id, $menu_id); // 通过后台用户ID、菜单表ID获取
        if( !empty( $old_data))
        {   // 执行更新
            BsAdminSettingModel::where( 'id', $old_data['id'])
                ->update([ 'order_list' => json_encode( $list)]);
            CommonModel::operateLog( CommonModel::getType(), '公共设置',
                'bs_admin_setting', $old_data['id'], $old_data, '更新成功', 1);
        }
        else
        {   // 执行添加
            $add_data = [
                'userid' => $user_id,
                'menu_id' => $menu_id,
                'order_list' => json_encode( $list)
            ];
            $new_id = ( new BsAdminSettingModel())->insertGetId( $add_data);
            CommonModel::operateLog( CommonModel::getType(), '公共设置',
                'bs_admin_setting', $new_id, $add_data, '添加成功', 1);
        }
        return true;
    }

    /**
     * 繁化简方法
     * @date 2020年1月17日17:21:03
     * @f1 判断携带的参数是否为数组
     * 是数组则遍历，判断1是2否还是数组，
     * 1.遍历后，判断是否还是数组，是数组，则递归调用且把数据赋值给新数组中
     * 不是数组则直接调用@see FanJianCovert::tradition2simple()
     * 2.不是数组则直接调用方法 @see FanJianCovert::tradition2simple()
     * @param $tradition string|array 繁体
     * @return array|string 简体
     */
    public static function fanJianConvertForAll( $tradition)
    {
        if( is_array( $tradition))
        {   // 是数组（可能也是多维数组），递归调用
            $simple = [];
            foreach ( $tradition as $k => $v)
            {
                if( is_array( $v))
                {   // 递归
                    $simple[$k] = self::fanJianConvertForAll( $v);
//                    array_push( $simple, self::fanJianConvertForAll( $v));
                }
                else
                {   // 调用转换方法
                    $simple[$k] = FanJianCovert::tradition2simple( $v);
//                    array_push( $simple, FanJianCovert::tradition2simple( $v));
                }
            }
        }
        else
        {   // 非数组，调用方法
            $simple = FanJianCovert::tradition2simple( $tradition);
        }

        return $simple;
    }

    /**
     * 操作日志
     * @date 2020年1月17日17:21:10
     * @f1 设置空数组，将接收的参数赋值给空数组中
     * @f2 查询表的注释（作用：用注释替换下标）
     * @f3 查询表的主键 1.根据表主键进行查询数据 2. 将主键ID在新旧数据中展示输出
     * @f4 判断是否为数组，是一维数组则转二维数组，不是数组则返回错误
     * @f5 优化携带的ID、分割成数组
     * @f6 根据f3的主键 in f5的ID 查询数据
     * @f7 将新旧数据中的“date”、“time”字段全部转化为日期格式
     * @f8 f6查询的新数据存在则为1.新增/修改，否则为2.删除
     * 1. 旧数据有主键则将主键输出比较。不是主键则判断旧数据是否设置且不等于新数据，输出比较。
     * 2. 删除则把新数据赋值为“null”
     * @f9 用字段注释替换下标
     * @f10 追加see_note字段
     * @f11 写入日志
     * @param string $type 操作类型
     * @param string $column 操作表名称
     * @param string $table 表名
     * @param string $table_id 变动的ID
     * @param array $data 变动前的数据
     * @param string $explain 操作说明
     * @param int $state 操作状态
     * @param int $admin_id 操作人ID
     * @param string $admin_name 操作人姓名
     * @return bool|string
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public static function operateLog( $type, $column = '', $table, $table_id, $data = [],
                            $explain, $state, $admin_id = 0, $admin_name = '')
    {
        $add_data = [];

        $add_data['admin_id'] = session( 'id') ?? $admin_id; // 操作人ID
        $add_data['admin_name'] = session( 'user.username') ?? $admin_name; // 操作人姓名
        $add_data['annotation'] = $column; // 操作表名称（表的注释）
        $add_data['operate_function'] = $type; // 操作类型
        $add_data['operate_time'] = date( 'Y-m-d H:i:s'); // 操作时间
        $add_data['operate_ip'] = get_ip(); // 操作IP
        $add_data['remarks'] = $table . '+' . $table_id . '+' .
            json_encode( $data, JSON_UNESCAPED_UNICODE); // 备注
        $add_data['description'] = $explain; // 操作说明
        $add_data['operate_state'] = $state; // 操作状态

        // 查询表的注释
        $sql = 'select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name="'.$table.'"and table_schema="up"';
        $annotation = Db::query($sql);

        // 查询表的主键
        $primary = '';
        foreach ( Db::query("show index from $table") as $k => $v)
        {
            if( $v['Key_name'] == 'PRIMARY'){
                $primary = $v['Column_name'];
            }
        }

        if( is_array( $data)) // 是否为数组
        {
            $result = [];
            if( count( $data) == count( $data, 1)) // 是否是一维数组
            {   // 一位数组, 一维数组重构成二维数组
                $datas[] = $data;
            }
            else
            {   // 二维数组，直接赋值
                $datas = $data;
            }

            // 把传过来的id做调整
            $table_id = str_replace('[','',$table_id); // 去除[
            $table_id = str_replace(']','',$table_id); // 去除]
            $table_id = str_replace('"','',$table_id); // 去除"
            $table_id = str_replace("'",'',$table_id); // 去除'
            $id = explode(',',$table_id); // 转为数组

            $new_data = db( $table)->where( $primary, 'in', $id)->select(); // 修改后的数据
            // 把旧数据值为时间戳的字段转换为日期格式
            foreach ( $datas as $k => $v)
            {
                foreach ( $v as $kk => $vv)
                {
                    if( stristr( $kk, 'time') || stristr( $kk, 'date'))
                    {
                        if( is_numeric( $vv) && strlen( $vv) == 10)
                        {
                            $datas[$k][$kk] = date( 'Y-m-d H:i:s', $vv);
                        }
                    }
                }
            }

            // 把新数据值为时间戳的字段转换为日期格式
            foreach ( $new_data as $k => $v)
            {
                foreach ( $v as $kk => $vv)
                {
                    if( stristr( $kk, 'time') || stristr( $kk, 'date'))
                    {
                        if( is_numeric( $vv) && strlen( $vv) == 10)
                        {
                            $new_data[$k][$kk] = date( 'Y-m-d H:i:s', $vv);
                        }
                    }
                }
            }
            if( $new_data)
            {   // 新增或修改 或逻辑删除
                foreach ( $new_data as $k => $v)
                {
                    foreach ( $v as $kk => $vv)
                    {
                        if( isset( $datas[$k][$primary]))
                        {   // 有主键
                            if( $kk == $primary)
                            {   // 主键存在的时候把主键输出
                                $result[$k]['field'][] = $kk; // 字段
                                $result[$k]['old'][] = $datas[$k][$kk]; // 旧数据
                                $result[$k]['new'][] = $vv; // 新数据
                            }
                            elseif( isset($datas[$k][$kk]) &&  $vv != $datas[$k][$kk])
                            {
                                // 新数据与旧数据不同时
                                $result[$k]['field'][] = $kk; // 字段
                                $result[$k]['old'][] = $datas[$k][$kk]; // 旧数据
                                $result[$k]['new'][] = $vv; // 新数据
                            }
                        }
                        else
                        {   // 主键不存在
                            $result[$k]['field'][] = $kk; // 字段
                            $result[$k]['old'][] = ''; // 旧数据
                            $result[$k]['new'][] = $vv; // 新数据
                        }
                    }
                }
            }
            else
            {   // 物理删除
                foreach ( $datas as $k => $v)
                {
                    foreach ( $v as $kk => $vv)
                    {
                        $result[$k]['field'][] = $kk; // 字段名
                        $result[$k]['old'][] = $vv; // 旧值
                        $result[$k]['new'][] = 'null'; // 新值
                    }
                }
            }
            // 用字段注释替换下标
            foreach ( $result as $k => $v)
            {
                foreach ( $v['field'] as $kk => $vv) // 字段key值
                {
                    foreach ( $annotation as $kkk => $vvv) // 字段注释
                    {
                        if( $vv == $vvv['COLUMN_NAME'])
                        {
                            $result[$k]['field'][$kk] = $vvv['column_comment'];
                        }
                    }
                }
            }

            $see_note['table_name'] = $column . "(".$table.")";
            $see_note['content'] = $result;

            $add_data['see_note'] = json_encode( $see_note, JSON_UNESCAPED_UNICODE); // 明细查看

            Db::connect(  config( 'db_log'))->name( 'ad_admin_operate_log')
                ->insert( $add_data); // 添加日志

            return true;
        }
        else
        {
            return '传递的参数存在错误';
        }
    }

    /**
     * 添加/修改到语言表
     * @date 2020年1月14日12:59:18
     * @f1 将携带的中文名称、英文名称和转换的繁体名称赋值到新数组中
     * @f2 判断是1.新增还是2.修改操作
     * 1. 新增则将组装好的数组直接插入到语言表中且返回新增主键，写入操作日志
     * 2. 根据$data_id、$lang_type、$table去查询数据，有则修改，无则添加，写入日志
     * @param $operate string 操作 （insert：增加   update：修改）
     * @param $name string 名称  (传简体过来)
     * @param $en_name string 英文名称
     * @param $data_id int 对应的数据id
     * @param $lang_type string 对应的表和字段
     * @param $table string 语言表名 (默认‘la_public_lang’)
     * @return bool
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @throws \think\exception\PDOException
     */
    public static function commonLang( $operate, $name, $en_name, $data_id, $lang_type, $table = 'la_public_lang')
    {
        $data['name'] = $name; // 简体名称
        $data['hk_name'] = FanJianCovert::simple2tradition( $name); // 繁体名称
        $data['en_name'] = $en_name; // 英文名称
        switch ( $operate)
        {
            case 'insert' :
                $data['data_id'] = $data_id; // 对应ID
                $data['lang_type'] = $lang_type; // 对应的表和字段
                $lang_id = db( $table)->insertGetId( $data); // 新增语言表数据
                CommonModel::operateLog( CommonModel::getType(), '公共语言', $table, $lang_id,
                    $data, '添加成功', 1);
                break;
            case 'update' :
                $la = db( $table)->where( 'data_id', $data_id)
                    ->where( 'lang_type', $lang_type)
                    ->find(); // 对应语言表的数据
                if( $la)
                {   // 有，则修改
                    db( $table)->where( 'data_id', $data_id)
                        ->where( 'lang_type', $lang_type)
                        ->update( $data);
                    CommonModel::operateLog( CommonModel::getType(), '公共语言', $table, $la['id'],
                        $la, '修改成功', 1);
                }
                else
                {   // 无，则添加
                    $data['data_id'] = $data_id; // 对应ID
                    $data['lang_type'] = $lang_type; // 对应的表和字段
                    $lang_id = db( $table)->insertGetId( $data); // 新增语言表数据
                    CommonModel::operateLog( CommonModel::getType(), '公共语言', $table, $lang_id,
                        $data, '查无添加', 1);
                }
                break;
        }

        return true;
    }

    /**
     * 获取搜索数据
     * @date 2020年1月17日09:56:14
     * 根据$type参数来获取对应的缓存数据
     * 根据$lang_type参数来获取对应的缓存语言
     * @param string $lang_type 获取的语言
     * @param array $type 需要获取的类型用数组传入获取类型
     * (hotArea:获取热门地区,hotel:获取最近浏览酒店,area:最近搜索地区)
     * @return array
     */
    public function getSearchData( $lang_type = 'zh_hk',
            $type = [ 'hotArea', 'hotel', 'area', 'default', 'groomCountry'])
    {
        $return_data = [];

        if( in_array( 'hotArea', $type))
        {
            $area_hot = $this->getAreaHot( $lang_type); // 获取热门地区
            if( $area_hot)
            {
                $return_data['areaHot'] = $area_hot;
            }
        }

        if( in_array( 'hotel', $type))
        {
            $lately_browse = $this->getLatelyBrowse( $lang_type); // 获取最近浏览酒店
            if( $lately_browse)
            {
                $return_data['latelyBrowse'] = $lately_browse;
            }
        }

        if( in_array( 'area', $type))
        {
            $lately_search = $this->getLatelySearch( $lang_type); // 获取最近搜索地区
            if( $lately_search)
            {
                $return_data['latelySearch'] = $lately_search;
            }
        }

        if( in_array( 'default', $type))
        {
            $return_data['areaDefault'] = $this->getDefaultAreaCache( $lang_type); // 获取默认显示地区
        }

        if( in_array( 'groomCountry', $type))
        {
            $return_data['groomCountry'] = $this->getGroomCountryCache( $lang_type); // 获取默认显示地区
        }

        return $return_data;
    }

    /**
     * 获取热门地区
     * @date 2020年1月16日17:02:38
     * @f1 获取热门地区缓存
     * @f2 遍历f1追加第一个名称
     * @param string $lang_type
     * @return array|bool
     */
    public function getAreaHot( $lang_type = 'zh_hk')
    {
        $cache = WProductCache::instance();

        $area_hot = $cache->getHotAreaCache(); // 获取热门地区缓存

        if( !$area_hot)
        {
            return false;
        }

        $area_hot = json_decode( $area_hot, true); // 格式化

        $return_data = [];

        foreach ( $area_hot as $k => $v)
        {
            $return_data[$k] = $v[$lang_type]; // 追加到新数组中
            $j_name = explode( ' · ', $v[$lang_type]['name'])[0]; // 获取第一个名称
            $return_data[$k]['jname'] = $j_name;
        }

        return $return_data;
    }

    /**
     * 获取最近浏览酒店
     * @date 2020年1月16日17:48:54
     * @f1 从cookie中获取最近搜索的地区
     * @f2 格式化f1且按照时间倒序遍历
     * @f3 获取缓存数据
     * @see WproductCache::getCache()
     * @f4 f3中获取对应语言
     * @param string $lang_type
     * @return array|bool
     */
    public function getLatelyBrowse( $lang_type = 'zh_hk')
    {
        $cache = WProductCache::instance();

        $lately_browse = cookie( 'latelyBrowse'); // 从cookie中获取最近搜索的地区
        if( empty( $lately_browse))
        {
            return false;
        }

        $lately_browse = json_decode( $lately_browse, true);
        krsort( $lately_browse); // 按照时间降序

        $return_data = [];
        foreach ( $lately_browse as $k => $v)
        {
            $data = $cache->getCache( $v, 'hotel'); // 获取缓存数据
            if( empty( $data))
            {
                continue;
            }

            $data = $data[0][0];
            $return_data[$k] = $data[$lang_type];
            $j_name = explode(' · ', $data[$lang_type]['name']);
            $return_data[$k]['jname'] = $j_name[0];
            $return_data[$k]['janame'] = $j_name[1];
        }

        return $return_data;
    }

    /**
     * 获取最近浏览地区
     * @date 2020年1月16日18:04:02
     * @f1 从cookie中获取最近搜索地区
     * @f2 格式化f1且按照时间倒序
     * @f3 遍历f2 获取缓存数据
     * @param string $lang_type
     * @return array|bool
     */
    public function getLatelySearch( $lang_type = 'zh_hk')
    {
        $cache = WProductCache::instance();

        $lately_search = cookie( 'latelySearch'); // 从cookie中获取最近搜索地区

        if( empty( $lately_search))
        {
            return false;
        }

        $lately_search = json_decode( $lately_search, true);
        krsort( $lately_search); // 按照时间倒序

        $return_data = [];
        foreach ( $lately_search as $k => $v)
        {
            $data = $cache->getCache( $v['id'] ,'area'); // 获取缓存数据
            $data = $data[0][0];

            $return_data[$k] = $data[$lang_type];
            $j_name = explode(' · ', $data[$lang_type]['name']);
            $return_data[$k]['jname'] = $j_name[0];
        }

        return $return_data;
    }

    /**
     * 获取默认显示地区
     * @date 2020年1月17日09:45:51
     * @f1 获取默认显示地区
     * @f2 取出指定地区语言
     * @param string $lang_type
     * @return mixed
     */
    public function getDefaultAreaCache( $lang_type = 'zh_hk')
    {
        $cache = WProductCache::instance();

        $default_area = $cache->getDefaultAreaCache(); // 获取默认显示地区
        $default_area = json_decode( $default_area, true);

        return $default_area[$lang_type];
    }

    /**
     * 获取默认显示地区
     * @date 2020年1月17日09:45:51
     * @f1 获取默认显示地区
     * @f2 取出指定地区语言
     * @param string $lang_type
     * @return mixed
     */
    public function getGroomCountryCache( $lang_type = 'zh_hk')
    {
        $cache = WProductCache::instance();

        $groom_country = $cache->getGroomCountryCache();
        $groom_country = json_decode( $groom_country, true);

        return $groom_country[$lang_type];
    }








































































}